package com.cool.feiyan

//import com.bennyhuo.kotlin.deepcopy.annotations.DeepCopy
//import com.bennyhuo.kotlin.deepcopy.runtime.DeepCopyScope

// javascript 源代码里的算法：
// Math.floor(new Date().getTime()/1000/3600
// kotlin 的数据类的构造函数必须要有一个形参

data class FeiYanData(
    var id : Int = 0,
    var 交通类型 : String = "",
    var 日期 : String = "",
    var 车次_车牌_航班号_场所名 : String = "",
    var 车厢 : String = "",
    var 出发站 : String = "",
    var 到达站 : String = "",
    var 车次附加描述 : String = "",
    var 开始时间 : String = "",
    var 结束时间 : String = "",
    var 线索来源名称 : String = "",
    var 线索来源网址 : String = "",
    var 提交时间 : String = "",
    var 更新时间 : String = "",
    var 验证通过 : Boolean = false
)

data class 分类数据 (
    var 依据 : String = "",
    var feiYanData : MutableList<FeiYanData> = mutableListOf()
)


/*
fun <T : Any> T.deepCopy(): T {
    //如果不是数据类，直接返回
    if (!this::class.isData) {
        return this
    }

    //拿到构造函数
    return this::class.primaryConstructor!!.let {
            primaryConstructor ->
        primaryConstructor.parameters.map { parameter ->
            //转换类型
            //memberProperties 返回非扩展属性中的第一个并将构造函数赋值给其
            //最终value=第一个参数类型的对象
            val value = (this::class as KClass<T>).memberProperties.first {
                it.name == parameter.name
            }.get(this)

            //如果当前类(这里的当前类指的是参数对应的类型，比如说这里如果非基本类型时)是数据类
            if ((parameter.type.classifier as? KClass<*>)?.isData == true) {
                parameter to value?.deepCopy()
            } else {
                parameter to value
            }


            //最终返回一个新的映射map,即返回一个属性值重新组合的map，并调用callBy返回指定的对象
        }.toMap().let(primaryConstructor::callBy)
    }
}

fun <T : Any> T.deepCopy2(): T {
    //①判断是否为数据类，不是的话直接返回
    if (!this::class.isData) {
        return this
    }
    //②数据类一定有主构造器，不用怕，这里放心使用 !! 来转为非空类型
    return this::class.primaryConstructor!!.let { primaryConstructor ->
        primaryConstructor.parameters
            .map { parameter ->
                val value =
                    (this::class as KClass<T>).declaredMemberProperties.first { it.name == parameter.name }.get(this)
                //③如果主构造器参数类型为数据类，递归调用
                if ((parameter.type.classifier as? KClass<*>)?.isData == true) {
                    parameter to value?.deepCopy()
                } else {
                    parameter to value
                }
            }
            .toMap()
            .let(primaryConstructor::callBy)
    }
}
*/
//原文链接：https://blog.csdn.net/petterp/article/details/103859178
//https://www.bennyhuo.com/2018/12/02/deepcopy/

